// function promiseWait(time,isOff) {
//     return new Promise((resolve, reject) => {
//         if(time>0){
//             setTimeout(()=>{
//             },time)
//         }
//     })
// }
const arr = [];
for (let i = 0; i < 100; i++) {
    arr.push(() => new Promise((resolve) => {
        setTimeout(() => {
            console.log('done', i);
            resolve();
        }, 100 * i);
    }));
};

const parallelRun = () => {
    const runingTask = new Map();
    const inqueue = (totalTask, max) => {
        while (runingTask.size < max && totalTask.length) {
            const newTask = totalTask.shift();
            const tempName = totalTask.length;
            runingTask.set(tempName, newTask);
            newTask().finally(() => {
                runingTask.delete(tempName);
                inqueue(totalTask, max);
            });
        }
    }
    return inqueue;
};

parallelRun()(arr, 3);


// 7.假设一个重要服务有100个冗余节点，URL是一个列表:urlList=[urlO,url1,…url99]，
// 为了保证可用性和速度，现在web前端逻辑是初次请求发送三个并发请求三个不同节点，当某
// 个节点reject立即发送新请求下一个节点，获得数据前始终保持三个请求在request。任意
// 一个节点获得数据时,认为请求成功,立即结束所有正在进行的请求并返回请求数据。，在所有10
// 0个节点都试过—次都失败时才认为失败。请写一个async方法foo实现上面的逻辑。(为了简化问
//     题,已知请求数据方法是Promise函数Fetch.prototype.request()，取消请求方法是Fetch.
//     prototype.cancel() )

async function foo(urlList) {
    const MAX_CONCURRENT_REQUESTS = 3;  // 最大并发请求数量
    const MAX_FAILED_ATTEMPTS = urlList.length;  // 请求失败的最大尝试次数
  
    let successfulResponse = null;  // 成功响应数据
    let failedAttempts = 0;  // 失败尝试次数
  
    while (failedAttempts < MAX_FAILED_ATTEMPTS && !successfulResponse) {
      const requests = [];  // 当前并发请求数组
  
      for (let i = 0; i < MAX_CONCURRENT_REQUESTS; i++) {
        const url = urlList.shift();  // 获取下一个节点的URL
  
        if (!url) {
          break;  // URL列表已空，跳出循环
        }
  
        const requestPromise = Fetch.prototype.request(url);  // 发起请求
        requests.push(requestPromise);  // 将请求Promise添加到当前并发请求数组中
      }
  
      try {
        const response = await Promise.race(requests);  // 等待任一请求成功返回响应
        successfulResponse = response;  // 设置成功响应数据
  
        // 取消所有其他请求
        requests.forEach(requestPromise => {
          Fetch.prototype.cancel(requestPromise);
        });
      } catch (error) {
        failedAttempts++;
  
        // 取消当前失败的所有请求
        requests.forEach(requestPromise => {
          Fetch.prototype.cancel(requestPromise);
        });
  
        // 将失败节点的URL重新添加到URL列表的末尾
        for (let i = 0; i < requests.length; i++) {
          urlList.push(requests[i].url);
        }
      }
    }
  
    if (successfulResponse) {
      return successfulResponse;  // 返回成功响应数据
    } else {
      throw new Error('请求失败');  // 所有节点都失败了，抛出错误
    }
  }